package com.scalar.chiptrack.operations.inventoryps.actioncommands;

import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.scalar.chiptrack.actioncommands.ActionCommand;
import com.scalar.chiptrack.commons.SessionKeys;
import com.scalar.chiptrack.operations.dataentry.LotDetails;
import com.scalar.chiptrack.operations.dataentry.dao.DataEntryDAO;
import com.scalar.chiptrack.operations.inventoryps.forms.InventoryPackingSlipForm;
import com.scalar.chiptrack.operations.process.dao.NewProductDAO;
import com.scalar.chiptrack.operations.process.dao.ProductDao;
import com.scalar.chiptrack.operations.vendor.dao.VendorDAO;
import com.scalar.chiptrack.users.Functionality;
import com.scalar.chiptrack.users.User;

public class InventoryPackingSlipSearchCommand extends ActionCommand 
{
	private static final String ACTION_NAME = "/inventoryps.do" ;
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception 
	{

		InventoryPackingSlipForm inventoryPSForm = (InventoryPackingSlipForm) form;

        HashMap<String,String> errors = new HashMap<String,String>();
        HashMap<String,String> info   = new HashMap<String,String>();
        String action = request.getParameter("action");

        request.setAttribute(INFO_MESSAGES, info);
        request.setAttribute(ERROR_MESSAGES, errors);

        HttpSession mSession = request.getSession();
        User user = (User) mSession.getAttribute(SessionKeys.USER_KEY);

        if (user == null)
        {
            mSession.setAttribute(SessionKeys.SOURCE_PAGE_KEY, ACTION_NAME);
            return (mapping.findForward("login"));
        }
        else
        {
            if (user.isActionAllowed(Functionality.DATA_ENTRY, User.USER_ACTION_MODIFY))
            {
                request.setAttribute("showMessage", "FALSE");
            }
            else
            {
                request.setAttribute("showMessage", "TRUE");
            }
        }

        try
        {                           
            if (LOCATION_TYPE_DIE_BANK.equalsIgnoreCase( inventoryPSForm.getProcessType() ) )
            {
                int locationId = 0;
                if (inventoryPSForm.getLocationId() > 0 )
                {
                    locationId =VendorDAO.getLocationIdByLTypeandVendorId( inventoryPSForm.getLocationId(), LOCATION_TYPE_DIE_BANK );
                }
                request.setAttribute( "lotsList", DataEntryDAO.loadAllDieBankWipLots(inventoryPSForm.getProcessStepId(), locationId, inventoryPSForm.getLotId(), false, false  ) );
            }
            else
            {
        	    request.setAttribute( "lotsList",  DataEntryDAO.getAllRunningLotsByProcess( inventoryPSForm.getProcessType(), inventoryPSForm.getProcessStepId(), inventoryPSForm.getLocationId(), inventoryPSForm.getLotId() ) );
            }    
        	request.setAttribute( "processTypeList", NewProductDAO.loadAllProcessesFromDB( null, false ) );
        	request.setAttribute( "partNumbersList", ProductDao.loadAllPartsForProcessTypeByPsType( inventoryPSForm.getProcessType() ) );
        	request.setAttribute( "locationList",    VendorDAO.getVendorNamesByPsType( null, inventoryPSForm.getProcessType()) );
        	request.setAttribute( "toLocationList",  VendorDAO.getAllVendors() );
            inventoryPSForm.setProcessStepId( 0 );
            inventoryPSForm.setLocationId( 0 );
            inventoryPSForm.setToVendorId( 0 );
            inventoryPSForm.setLotId( 0 );
        	inventoryPSForm.setAvailableLotsList( new ArrayList<LotDetails>() );
        	request.setAttribute("action", action);
        }
        catch( Exception e)
        {
        	request.setAttribute("processTypeList", NewProductDAO.loadAllProcessesFromDB(null, false) );
        	errors.put( "Unable to get avilable lots for shipment", null); 
        	e.printStackTrace();
        }
        return mapping.findForward( "showLots" );
	}
}
